package com.farmer.utils;

import cn.hutool.core.collection.CollUtil;
import com.farmer.pojo.Menu;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.function.BiPredicate;
import java.util.stream.Collectors;


public class TreeUtils {

    /*
    * buildTree 方法用于构建树形结构的菜单列表。
    * 它接受一个 Menu 对象的列表作为参数，然后将这些菜单对象构建成树形结构，并返回根节点的列表。
    * 具体实现方式是通过将菜单列表转换为以菜单ID为键，菜单对象为值的 Map，
    * 然后遍历菜单列表，将每个菜单对象根据其父菜单ID添加到对应的父菜单对象的子菜单列表中，最终返回根节点的列表*/
    public static List<Menu> buildTree(List<Menu> menus) {
        Map<Integer, Menu> idMapping = menus.stream().collect(Collectors.toMap(Menu::getMid, menu -> menu));
        List<Menu> returnList = new LinkedList<>();
        for (Menu menu : menus) {
            Integer parentid = menu.getParentid();
            if (parentid == null || parentid.equals(0)) {
                returnList.add(menu);
            } else {
                idMapping.get(parentid).getChildren().add(menu);
            }
        }
        return returnList;
    }

/*
* foreachPredicate 方法用于遍历菜单列表并根据条件进行过滤。
* 它接受一个 Menu 对象的列表和一个 BiPredicate<Menu, Boolean> 函数式接口作为参数，
* 然后遍历菜单列表，根据传入的条件判断函数对菜单进行过滤。
* 具体实现方式是使用迭代器遍历菜单列表，对每个菜单对象进行条件判断，如果不满足条件则移除该菜单对象，然后递归处理子菜单列表*/
    public static void foreachPredicate(List<Menu> menus, BiPredicate<Menu, Boolean> predicate) {
        for (Iterator<Menu> iterator = menus.iterator(); iterator.hasNext(); ) {
            Menu mu = iterator.next();
            List<Menu> children = mu.getChildren();
            if (!predicate.test(mu, CollUtil.isEmpty(children))) {
                iterator.remove();
                continue;
            }
            if (CollUtil.isNotEmpty(children)) {
                foreachPredicate(children, predicate);
            }
        }
    }

}
